package com.apache.excp;

import java.io.File;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ConfigConstant {

	/*
	 * model 的查找编号  id
	 */
	public static final String MODEL_ID = "id";

	/*
	 * 从Excel 到 Model 转换的目标 javabean class
	 */
	public static final String MODEL_CLASS = "class";

	/*
	 * excel 列中对应到javabean中的 javabean属性名称
	 */
	public static final String PROPERTY_NAME = "name";

	/*
	 * excel中的标标题中的列数 (  取值的时候可以用javabean属性和对应的列数取值)
	 */
	public static final String PROPERTY_CLOUMN = "column";

	/*
	 * excel 列中对应到javabean中的 excel列标题名称  (取值的时候,可以用 javabean属性和Excel中的标题对应取值)
	 */
	public static final String PROPERTY_EXCEL_TITLE_NAME = "excelTitleName";

	/*
	 * excel 列是否可以为空。　值　Y：可以为空　N：不可以为空
	 */
	public static final String PROPERTY_ISNULL = "isNull";

	/*
	 * Model 写入到Excel时，每列的宽度。
	 */
	public static final String PROPERTY_COLUMN_WIDTH = "columnWidth";
	/*
	 * excel中的列数据要被转换的数据类型
	 */
	public static final String PROPERTY_DATA_TYPE = "dataType";

	/*
	 * excel中的数据最大长度
	 */
	public static final String PROPERTY_MAX_LENGTH = "maxLength";

	/*
	 * 在excel中没有列数据,需要系统对javabean属性中的某一个值设置一个动态传入的值(指所有JavaBean的这个属性值，都是统一传入的固定值).设置些属性,必须设置默认值
	 * 
	 * 他的值设置为 fixity = "yes" ,默认为 no.
	 */
	public static final String PROPERTY_FIXITY = "fixity";

	/*
	 * 在导入excel时,有些值在存入系统时,使用的值需要转换
	 * 如:一个保管期限的下拉列表中有{永久(Y),长期(C),短期(D)}
	 * 系统中存入的只能是 Y,C,D之类的值,导入Excel的值却是永久,长期,短期这类的值,需要转换.
	 * 转换方式:取到Excel中的具体值,加上保管期限前辍,从传入的Map中取值.如 取值长期  C = Map.get("bgqx长期"); 
	 * 
	 */
	public static final String PROPERTY_CODE_TABLE_NAME = "codeTableName";
	/*
	 * 如果值为空,设置的默认值
	 */
	public static final String PROPERTY_DEFAULT = "default";

	private static final String validNumber = "^[0-9]*$";

	/**
	 *只能输入数字
	 * 
	 * @param  str 传入的字符串
	 * @return     如果str为数字则为true，否则为false 
	 */
	public static boolean isValidNumber(String str) {
		boolean flag = isEqualString(str, validNumber);
		return flag;
	}

	/**
	 *判断两个字符串是否相等
	 * 
	 * @param  str 传入的字符串
	 * @return     如果两个字符串相等则为true，否则为false
	 */
	public static boolean isEqualString(String str, String val) {
		boolean flag = false;
		try {
			if (null != str && "".equals(str)) {
				Pattern p = Pattern.compile(val);// 设置比较模式 
				Matcher m = p.matcher(str);
				flag = m.matches();
			}
		} catch (Exception e) {
		}
		return flag;
	}

	/**
	 * 配制文件验证时保存。如果存在一个同名的标题，取　标题_1，如果存在　标题_1,取标题_2
	 * @param map　配制文件按顺序读取时，当前属性前所有属性值map,如果当前标题是 第 5 个，map size　为4
	 * @param excelTitle
	 * @return  如果标传入标题excelTitle在map存在，返回　excelTitle_1.如果excelTitle_1也存在，返回excelTitle_2
	 */
	@SuppressWarnings("rawtypes")
	public static String configValidate(Map map, String excelTitle) {
		String temp = excelTitle;
		for (int i = 0; i < map.size(); i++) {
			if (i > 0) {
				temp = excelTitle + "_" + i;
			}
			if (map.containsKey(temp)) {
				continue;
			} else {
				break;
			}
		}
		return temp;
	}

	public static String getFormatDate(Date date, String pattern) {
		if (pattern == null || pattern.length() < 1) {
			pattern = "yyyy-MM-dd";
		}
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(pattern);
			String strDate = sdf.format(date);
			return strDate;
		} catch (Exception e) {
			System.out.println("日期格转换失败！");
		}
		return null;
	}

	/**
	 * 验证excel表头，如果存在一个同名的标题，取　标题_1，如果存在　标题_1,取标题_2,这样可以把excel列中配制成同一个名称也可以读取。
	 * @param list　excel标题按顺序读取时，当前标题前所有值list,如果当前标题是 第 5 个，list size　为4
	 * @param excelTitle
	 * @return 如果标传入标题excelTitle在list存在，返回　excelTitle_1.如果excelTitle_1也存在，返回excelTitle_2
	 */
	@SuppressWarnings("rawtypes")
	public static String columnValidate(List list, String excelTitle) {
		String temp = excelTitle;
		for (int i = 0; i < list.size(); i++) {
			if (i > 0) {
				temp = excelTitle + "_" + i;
			}
			if (list.contains(temp)) {
				continue;
			} else {
				break;
			}
		}
		return temp;
	}

	/**
	 * @return 返回classes的绝对路径。
	 */
	public static String getClassLoaderPath() {
		String path = "";
		URL classLoaderUrl = Thread.currentThread().getContextClassLoader().getResource("");
		if (null == classLoaderUrl) {
			path = Thread.currentThread().getContextClassLoader().getResource("/").getPath();//tomcat/weblogic
		} else {
			path = classLoaderUrl.getPath();
		}
		if (isNotNull(path)) {
			if (path.startsWith(File.separator) || path.startsWith("/")) {
				String systemType = getSystemType();
				if ("windows".equals(systemType))
					path = path.substring(1);
			}
			if (!path.endsWith(File.separator) && !path.endsWith("/"))
				path += "/";
		}
		return path;
	}

	/**
	 * 获取操作系统类型
	 *
	 * @return 返回操作系统类型
	 */
	public static String getSystemType() {
		String result = "windows";
		if (System.getProperty("os.name").equals("Linux")) {
			result = "linux";
		} else if ("Mac OS X".equals(System.getProperty("os.name"))) {
			result = "Mac OS X";
		}
		return result;
	}

	/**
	 *判断一个字符串是否为空
	 * 
	 * @param  str 传入的字符串
	 * @return     如果str为空返回true，不为空返回false 
	 */
	public static boolean isNull(String str) {
		if (str == null) {
			return true;
		}
		str = str.trim();
		if ((str.equals("null")) || (str.equals(""))) {
			return true;
		}
		return false;
	}

	/**
	 *判断字符串不能为空
	 * 
	 * @param  str 传入的字符串
	 * @return     如果str不为空返回true，为空返回false   
	 */
	public static boolean isNotNull(String str) {
		return !isNull(str);
	}

	/**
	 * 新建目录操作
	 * 
	 * @param folderPath 文件夹路径
	 */
	public static boolean newCreateFolder(String folderPath) {
		boolean result = false;
		try {
			if (isNotNull(folderPath)) {
				File newFilePath = new File(folderPath);
				if (!newFilePath.exists()) {
					result = newFilePath.mkdirs();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
}
